package main

import (
	"fmt"
)

/*
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合
*/
// 定义一个结构体,内部是结构体的成员以及类型,并不是定义一个变量，使用时还需要再次声明变量操作
// 类似于面向对象的实例化操作;这个定义最好放在函数上面作为全局定义声明
type Books struct {
	title   string
	author  string
	subject string
	book_id int
}

// 传入结构体指针
func printBookP(book *Books) {
	fmt.Println(*book)
}

// 传入结构体
func printBook(book Books) {
	fmt.Println(book)
}
func main() {
	// 定义一个结构体变量
	var book1 Books
	// 为这个结构体变量赋值的一种方式
	// 注意：忽略的字段为0或空
	book1.title = "test"
	book1.author = "my"
	book1.subject = "地理"
	book1.book_id = 1002
	// 直接将整个结构体输出
	fmt.Println(book1)
	// 访问结构体的成员
	fmt.Println(book1.title)

	// 定义一个指针指向结构体
	p := &book1
	p.title = "指针测试" // 这种写法就等于 (*p).title = "指针测试"
	printBookP(&book1)
	printBook(book1)

	// 定义一个结构体变量，并赋初值
	// 1 使用key value方式赋初值，忽略的的字段为0或空
	var book2 = Books{title: "测试"}
	// 2不使用 key value 的方式赋初值，那么必须要完整赋值，不能有空值
	var book3 = Books{"Go语言入门到上天", "aeasringnar", "aea", 666}
	printBook(book2)
	printBook(book3)
}
